//package com.xsj.controller;
//
//import com.pll.dto.ResponseDto;
//import com.xsj.client.WebSocketClient;
//import com.xsj.vo.ChatMessageVo;
//import jakarta.annotation.PostConstruct;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.*;
//
//import java.util.HashMap;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.ConcurrentMap;
//import java.util.function.Consumer;
//
///**
// * 聊天控制器
// * 处理用户聊天消息并通过WebSocket发送给客服
// */
//@RestController
//@RequestMapping("/chat")
//public class ChatController {
//
//    @Autowired
//    private WebSocketClient webSocketClient;
//
//    /**
//     * 消息处理器映射
//     * 用于存储不同类型消息的处理函数
//     */
//    private final ConcurrentMap<String, Consumer<String>> messageHandlers = new ConcurrentHashMap<>();
//
//    /**
//     * 初始化方法
//     * 注册消息处理器并确保WebSocket连接
//     */
//    @PostConstruct
//    public void init() {
//        // 注册默认消息处理器
//        registerMessageHandler("default", this::handleDefaultMessage);
//
//        // 设置WebSocketClient的消息处理器
//        webSocketClient.setMessageHandler(this::handleCustomerServiceMessage);
//
//        // 确保WebSocket连接已建立
//        if (!webSocketClient.isConnected()) {
//            webSocketClient.connect();
//        }
//    }
//
//    /**
//     * 注册消息处理器
//     * @param messageType 消息类型
//     * @param handler 处理函数
//     */
//    public void registerMessageHandler(String messageType, Consumer<String> handler) {
//        messageHandlers.put(messageType, handler);
//    }
//
//    /**
//     * 处理默认消息
//     * @param message 消息内容
//     */
//    private void handleDefaultMessage(String message) {
//        System.out.println("收到客服消息: " + message);
//        // 这里可以添加默认的消息处理逻辑
//        // 例如保存消息到数据库、推送给前端等
//    }
//
//    /**
//     * 处理接收到的客服消息
//     * 根据消息类型分发到不同的处理器
//     * @param message 消息内容
//     */
//    public void handleCustomerServiceMessage(String message) {
//        try {
//            // 解析消息类型
//            String messageType = parseMessageType(message);
//
//            // 根据消息类型选择处理器
//            Consumer<String> handler = messageHandlers.getOrDefault(messageType, messageHandlers.get("default"));
//            handler.accept(message);
//        } catch (Exception e) {
//            System.err.println("处理客服消息出错: " + e.getMessage());
//            // 使用默认处理器处理异常情况
//            messageHandlers.get("default").accept(message);
//        }
//    }
//
//    /**
//     * 解析消息类型
//     * @param message 原始消息内容
//     * @return 消息类型
//     */
//    private String parseMessageType(String message) {
//        // 这里需要根据实际的消息格式解析消息类型
//        // 简单示例，假设消息是JSON格式
//        if (message.contains("\"type\":\"system\"")) {
//            return "system";
//        } else if (message.contains("\"type\":\"agent\"")) {
//            return "agent";
//        } else {
//            return "default";
//        }
//    }
//
//    /**
//     * 格式化发送给客服的消息
//     * @param message 聊天消息对象
//     * @return 格式化后的消息
//     */
//    private String formatMessageForCustomerService(ChatMessageVo message) {
//        // 这里可以根据实际需求格式化消息
//        // 例如添加消息类型、用户标识等
//        return String.format("{\"type\":\"customer_message\",\"content\":\"%s\",\"userId\":\"%s\",\"timestamp\":%d}",
//                message.getContent(),
//                message.getUserId(),
//                System.currentTimeMillis());
//    }
//
//    /**
//     * 发送消息给客服
//     * @param message 聊天消息对象
//     * @return 响应结果
//     */
//    @PostMapping("/send")
//    public ResponseDto send(@RequestBody ChatMessageVo message) {
//        try {
//            if (message == null || message.getContent() == null || message.getContent().trim().isEmpty()) {
//                return ResponseDto.fail(405,"消息内容不能为空");
//            }
//
//            // 格式化消息并发送给客服
//            String formattedMessage = formatMessageForCustomerService(message);
//            webSocketClient.sendMessage(formattedMessage);
//
//            return ResponseDto.success("消息发送成功");
//        } catch (Exception e) {
//            System.err.println("发送消息失败: " + e.getMessage());
//            return ResponseDto.fail(405,"发送消息失败: " + e.getMessage());
//        }
//    }
//
//    /**
//     * 获取连接状态
//     * @return 连接状态
//     */
//    @GetMapping("/connection-status")
//    public ResponseDto getConnectionStatus() {
//        try {
//            boolean connected = webSocketClient.isConnected();
//            Map<String, Object> data = new HashMap<>();
//            data.put("connected", connected);
//            data.put("message", connected ? "已连接到客服" : "未连接到客服");
//
//            return ResponseDto.success(data);
//        } catch (Exception e) {
//            System.err.println("获取连接状态失败: " + e.getMessage());
//            return ResponseDto.fail(405,"获取连接状态失败: " + e.getMessage());
//        }
//    }
//
//    /**
//     * 断开与客服的连接
//     * @return 响应结果
//     */
//    @PostMapping("/disconnect")
//    public ResponseDto disconnect() {
//        try {
//            if (webSocketClient.isConnected()) {
//                // 可以发送一个断开连接的消息
//                webSocketClient.sendMessage("{\"type\":\"disconnect\"}");
//            }
//            return ResponseDto.success("已断开与客服的连接");
//        } catch (Exception e) {
//            System.err.println("断开连接失败: " + e.getMessage());
//            return ResponseDto.fail(405,"断开连接失败: " + e.getMessage());
//        }
//    }
//
//    /**
//     * 重新连接到客服
//     * @return 响应结果
//     */
//    @PostMapping("/reconnect")
//    public ResponseDto reconnect() {
//        try {
//            if (webSocketClient.isConnected()) {
//                webSocketClient.sendMessage("{\"type\":\"reconnect\"}");
//            } else {
//                webSocketClient.connect();
//            }
//            return ResponseDto.success("正在尝试重新连接");
//        } catch (Exception e) {
//            System.err.println("重新连接失败: " + e.getMessage());
//            return ResponseDto.fail(405,"重新连接失败: " + e.getMessage());
//        }
//    }
//}
